package javafoundation.thread;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * @ClassName V_04_线程池方式创建
 * @Description TODO
 * @Author dzf
 * @Date 2023/3/2 10:28
 * @Version 1.0
 */
public class V_04_线程池方式创建 {
    //线程池创建方法
    //1、通过 ThreadPoolExecutor 类创建(推荐)
    //2、通过 Executors 类创建
    //这两种方式在本质上是一种方式，都是通过 ThreadPoolExecutor 类的方式创建，因为 Exexutors 类调用了 ThreadPoolExecutor 类的方法。
    //Executors 类创建线程池的三种常用形式：固定线程池、独立线程池和缓冲线程池

    //new SingleThreadExecutor ：创建一个单线程的线程池，此线程池保证所有任务的执行顺序按照任务的提交顺序执行。
    //new FixedThreadPool ：创建固定大小的线程池，每次提交一个任务就创建一个线程，直到线程达到线程池的最大大小。
    //new CachedThreadPool ：创建一个可缓存的线程池，此线程池不会对线程池大小做限制，线程池大小完全依赖于操作系统（或者说JVM）能够创建的最大线程大小。
    //new ScheduledThreadPool ：创建一个大小无限的线程池，此线程池支持定时以及周期性执行任务的求。

    public static void main(String[] args) {
        /**
         * 创建固定线程池（大小固定）
         **/
        ExecutorService pool1 = Executors.newFixedThreadPool(2);
        Runnable task1 = () -> {
            while (true) {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName());
            }
        };
        pool1.execute(task1);
        pool1.execute(task1);
        pool1.execute(task1);

        /**
         * 创建缓冲线程池（大小可变）
         **/
        ExecutorService pool2 = Executors.newCachedThreadPool();
        Runnable task2 = () -> {
            while (true) {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName());
            }
        };
//        pool2.execute(task2);
//        pool2.execute(task2);
//        pool2.execute(task2);

        /**
         * 创建独立线程池（线程相互独立）
         **/
        ExecutorService pool3 = Executors.newSingleThreadExecutor();
        Runnable task3 = () -> {
            while (true) {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName());
            }
        };
//        pool3.execute(task3);
//        pool3.execute(task3);
//        pool3.execute(task3);
    }

}
